
#数据池连接

#由于查询数据可能很少，所以决定选择数据池
#由于文档得分项要求——实体的设计——采用ORM
'''
import pymysql
from dbutils.pooled_db import PooledDB
from pymysql.cursors import DictCursor

POOL = PooledDB(
    creator=pymysql,
    maxconnections=10,
    mincached=2,
    maxcached=5,
    blocking=True,
    setsession=[],
    ping=0,
    host='localhost',
    port=3306,
    user='root',
    password='123456',
    database='watermarkremoval',
    charset='utf8'
)

def fetch_one(sql,params):
    conn = POOL.connection()   # 从连接池获取一个连接
    cursor = conn.cursor()     # 创建游标对象
    cursor.execute(sql, params)  # 执行 SQL 查询，参数化查询可以防止 SQL 注入攻击
    result = cursor.fetchone()  # 获取查询结果的第一行数据
    cursor.close()             # 关闭游标
    conn.close()               # 关闭数据库连接，将连接放回连接池
    return result              # 返回查询结果

def fetch_all(sql,params):
    conn = POOL.connection()
    cursor = conn.cursor()
    cursor.execute(sql, params)
    results = cursor.fetchall()  # 获取查询结果的所有数据
    cursor.close()
    conn.close()
    return results

def fetch_many(sql,params):
    conn = POOL.connection()
    cursor = conn.cursor()
    cursor.execute(sql, params)
    results = cursor.fetchmany(size=5)  # 获取前 5 行数据
    cursor.close()
    conn.close()
    return results

def insert_data(sql, params):
    conn = POOL.connection()
    cursor = conn.cursor()
    try:
        cursor.execute(sql, params)
        conn.commit()  # 提交事务
    except Exception as e:
        conn.rollback()  # 发生异常时回滚事务
        raise e
    finally:
        cursor.close()
        conn.close()
'''
'''
选择使用连接池直接执行 SQL 查询还是使用 ORM（例如 SQLAlchemy）来创建 models 主要取决于你的项目需求、团队技能和个人偏好。以下是它们各自的优缺点：

使用连接池执行 SQL 查询：
优点：
直接性和灵活性： 使用原生 SQL 查询可以更直接地与数据库交互，对于复杂查询或特定优化需求更加灵活。
性能控制： 可以更精确地控制数据库连接的获取和释放，以及 SQL 查询的执行方式，适合对性能有高要求的场景。
轻量级： 对于小型项目或只需简单数据库交互的项目，不需要引入额外的 ORM 框架和复杂性。
缺点：
手动管理： 需要手动管理数据库连接的获取和释放，容易引入连接泄露或不当的连接管理。
重复性代码： 需要重复编写和维护 SQL 查询语句，增加了代码的复杂性和维护成本。
缺少对象关系映射： 没有 ORM 提供的对象关系映射功能，可能需要手动处理结果集的转换和数据对象的构建。

使用 ORM 创建 models：
优点：
抽象性： 提供了对象关系映射，使得数据库表与应用中的数据模型对象直接映射，简化了数据操作和代码编写。
数据库无关性： ORM 层通常可以提供数据库无关性，可以比较方便地切换不同的数据库系统。
自动化： 提供了自动化的数据库操作，如 CRUD 操作，以及查询构造器，简化了常见数据库操作的编写。
缺点：
学习曲线： 使用 ORM 框架可能需要学习其特定的语法和工作方式，对新手来说可能有一定的学习曲线。
性能折衷： 在某些高性能需求下，ORM 可能不能像手写 SQL 那样精确控制每个查询的性能优化。
复杂性和额外开销： 引入 ORM 框架可能增加项目的复杂性和额外的运行时开销，尤其是在小型项目或简单的数据库操作场景下可能显得不必要。

选择建议：
小型项目或简单需求： 如果项目规模较小，对数据库交互需求简单，使用连接池直接执行 SQL 查询可能更加合适，可以减少额外的复杂性和开销。
大型项目或复杂需求： 如果项目需要频繁的数据库操作、复杂的查询需求或需要对象关系映射来简化数据操作，使用 ORM 框架可能更加合适，可以提高开发效率和代码的可维护性。

综上所述，选择使用连接池还是 ORM 框架取决于具体的项目需求和团队技术栈。在实际开发中，也可以根据具体的场景和需求进行灵活选择和权衡。
'''